package org.brisling.service.common;

import java.util.ArrayList;
import java.util.List;

import org.brisling.domain.common.ListDomain;
import org.brisling.domain.sysman.inf.BizBeanDataModeler;
import org.brisling.domain.sysman.inf.ManageBeanDataModeler;
import org.brisling.repository.inf.ManageRepository;
import org.brisling.util.JsonUtil;
import org.brisling.util.LongUtil;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort;

/**
 * 
 * 多对多关联业务基础service类，所有多对多关联业务必须继承该类
 * @author : jackson wang
 * @Date   : 2015年6月8日 下午8:19:47
 * @version: 1.0
 */
public class BaseManageService{

	//定义起始页是否为1
	private Boolean pageBasedOne=false;
	
	
	/*
	 * easyui列表页面分页封装方法
	 */
	@SuppressWarnings({ "rawtypes", "unchecked" })
	/**
	 * 根据多对多关联中主导对象唯一编码查找多对多关联实体类
	 * @param biztid 主导对象唯一编码
	 * @param page 分页参数
	 * @param pageSize 页号
	 * @param repo 业务仓库接口
	 * @return ListDomain 按照easyui分页要求封装的多对多实体集合(total,rows)
	 * @see ListDomain 
	 */
	public ListDomain<ManageBeanDataModeler> getPagedListByBiztid(String biztid,String page,String pageSize,
			ManageRepository repo){
		
		Long _biztid = LongUtil.getLongValue(biztid, null);
		Integer _page = LongUtil.getIntValue(page, 0);
		Integer _pageSize = LongUtil.getIntValue(pageSize, 10);
		
		
		ListDomain<ManageBeanDataModeler> listDomain = new ListDomain<ManageBeanDataModeler>();
		//dept为空，返回空值对象
		if(_biztid==null){
			listDomain.setTotal(0l);
			listDomain.setRows(new ArrayList<ManageBeanDataModeler>());
			return listDomain;
		}
	
		if(!pageBasedOne)
			_page -= 1;
		
		PageRequest _pageRequest = 
				new PageRequest(_page,_pageSize,new Sort(new String[] { "sortedid" }));
		
		Long _total = repo.countByBiztid(_biztid);
		List<ManageBeanDataModeler> _usrList = repo.findByBiztid(_biztid, _pageRequest);		
		
		listDomain.setTotal(_total);
		listDomain.setRows(_usrList);
		
		return listDomain;
		
	}
	
	
	@SuppressWarnings({ "rawtypes" })
	/**
	 * 根据多对多关联中主导对象唯一编码查找多对多关联实体类
	 * @param biztid 多对多关系中主导对象唯一编码
	 * @param repo 多对多业务仓库接口
	 * @return List 多对多关系实体集合
	 */
	public List<? extends ManageBeanDataModeler<BizBeanDataModeler,BizBeanDataModeler>> getListByBiztid(String biztid,
			ManageRepository repo){
		
		Long _biztid = LongUtil.getLongValue(biztid, null);
		
		return this.getListByBiztid(_biztid, repo);
	}
	
	/*
	 * 关联对象查询方法，根据主导对象查询所有关联对象数据
	 */
	@SuppressWarnings({ "rawtypes", "unchecked" })
	/**
	* 根据多对多关联中主导对象唯一编码查找多对多关联实体类
	 * @param biztid 多对多关系中主导对象唯一编码
	 * @param repo 多对多业务仓库接口
	 * @return List 多对多关系实体集合
	 */
	public List<? extends ManageBeanDataModeler<BizBeanDataModeler,BizBeanDataModeler>> getListByBiztid(Long biztid,
			ManageRepository repo){
		
	
		if(biztid==null){
			return new ArrayList<ManageBeanDataModeler<BizBeanDataModeler,BizBeanDataModeler>>();
		}
		
		List<? extends ManageBeanDataModeler<BizBeanDataModeler,BizBeanDataModeler>> _list  =  repo.findByBiztid(biztid, new Sort(new String[] { "bizeid" }));
		
		//List<ManageBeanDataModeler> _list =   repo.findByBiztid(_biztid, new Sort(new String[] { "sortedid" }));	
		
		return _list;
	}
	
	/*
	 * 保存关联对象实体
	 */
	@SuppressWarnings({ "rawtypes", "unchecked" })
	/**
	 * 保存多对多关联对象实体
	 * @param repo  多对多业务仓库接口
	 * @param s 多对多关系实体
	 * @return ManageBeanDataModeler 多对多关系对象实体
	 */
	public <S extends ManageBeanDataModeler> S save(ManageRepository repo,S s){
		return  (S) repo.save(s);
	}
	
	/*
	 * 保存关联对象实体集合方法
	 */
	@SuppressWarnings({ "rawtypes", "unchecked" })
	/**
	 * 保存多对多关联对象实体集合
	 * @param repo 多对多业务仓库接口
	 * @param s 多对多关系实体集合
	 * @return List 多对多关系对象实体集合
	 */
	public List<? extends ManageBeanDataModeler>  save(ManageRepository repo,List<? extends ManageBeanDataModeler> s){
		
		Iterable<? extends ManageBeanDataModeler> ite = repo.save(s);
		if(ite instanceof List) {
			return (List<? extends ManageBeanDataModeler>) ite;
		}
		ArrayList<ManageBeanDataModeler> list = new ArrayList<ManageBeanDataModeler>();
		if(ite != null) {
			for(ManageBeanDataModeler t: ite) {
			    list.add(t);
			}
		}
		
		return   list;
	}
	
	/*
	 * 关联对象实体删除方法
	 */
	@SuppressWarnings({ "rawtypes", "unchecked" })
	/**
	 * 删除指定编码的多对多关系实体
	 * @param repo 多对多关系业务仓库接口
	 * @param id 多对多实体唯一编码
	 * @return String 返回操作状态码，200为成功标志
	 */
	public String del(ManageRepository repo,Long id){
		repo.delete(id);
		return "200";
	}
	
	/*
	 * 关联对象实体集合删除方法
	 */
	@SuppressWarnings({ "rawtypes", "unchecked" })
	/**
	 * 删除指定编码集合的多对多关系实体
	 * @param repo 多对多关系业务仓库接口
	 * @param id 多对多实体唯一编码集合
	 * @return String 操作状态码，200为成功标志
	 */
	public String del(ManageRepository repo,List<Long> id){
		repo.delete(id);
		return "200";
	}
	
	/*
	 * 关联对象实体集合删除方法
	 */
	@SuppressWarnings({ "rawtypes", "unchecked" })
	/**
	 * 删除多对多关系实体集合
	 * @param repo 多对多关系业务仓库接口
	 * @param _domains 多对多实体对象集合
	 * @return String 操作状态码，200为成功标志
	 */
	public String delAll(ManageRepository repo,List<? extends ManageBeanDataModeler> _domains){
		repo.delete(_domains);
		return "200";
	}
	
	/*
	 * 关联对象实体集合删除方法
	 */
	@SuppressWarnings({ "rawtypes" })
	/**
	 * 删除指定主导对象编码的多对多关系实体集合
	 * @param repo 多对多关系业务仓库接口
	 * @param biztid 多对多关系主导对象唯一编码
	 * @return String 操作状态码，200为成功标志
	 */
	public String delByBiztid(ManageRepository repo,Long biztid){
		repo.deleteByBiztid(biztid);
		return "200";
	}
	
	/*
	 * 关联对象实体集合删除方法
	 */
	@SuppressWarnings({ "rawtypes", "unchecked" })
	/**
	 * 
	 * 删除指定主导对象编码集合的多对多关系实体集合
	 * @param repo 多对多关系业务仓库接口
	 * @param biztid 多对多关系主导对象唯一编码集合
	 * @return String 操作状态码，200为成功标志
	 */
	
	public String delByBiztid(ManageRepository repo,List<Long> biztid){
		repo.deleteByBiztid(biztid);
		return "200";
	}
	
	@SuppressWarnings({ "rawtypes", "unchecked" })
	/**
	 * 根据前端传递的json参数构造实体对象
	 * @param body 前端传递的json数据对象
	 * @param clazz json构造实体的基类
	 * @return 根据json数据构造的基类实体对象
	 */
	public <S extends ManageBeanDataModeler> S  bodyToObj (String body,Class clazz){
		
		return (S) JsonUtil.bodyToObj(body, clazz);
	}
}
